Python 您所在的位置:网站首页 python 多维数组转一维 Python

Python

2023-04-18 22:46| 来源: 网络整理| 查看: 265

如题。

下文主要以三维数组为例进行解释,基于shape/维度概念,关于维度、shape概念可参考以下文章。numpy之转置(transpose)和轴对换 - 我的前进日志 - 博客园

说明:以下思考方式完全是我为了便于理解轴编号寻找的一个简便之法,如有不妥,还请指正。四维及以上数组应该也是适用的,只是很抽象,可以用简单的例子进行验证。

-------------------------------以下是正文

1.首先先定义一个简单的三维数组,可以知道shape为(2,3,4),对应0,1,2编号(可以理解为shape返回元祖(2,3,4)的索引)。

In [1]: import numpy as np In [2]: arr=np.arange(24).reshape(2,3,4) In [3]: arr Out[3]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) In [4]: arr.shape Out[4]: (2, 3, 4)

2.引入三维坐标便于理解

坐标中的(0,1,2)(蓝色标的)三个维度就是shape返回元祖的索引编号,至于为什么垂直于底面的轴编号是0,可以联系二维数组进行推理。

如上图,将arr数组想象成三维空间,如长方体,0-11 12位数在长方体的顶面,12-23在长方体的底面。

当axis=0时,剩余的1,2维度组成了垂直于轴0的平面,这个平面上的数组有[0,1,2,3 4,5,6,7 8,9,10,11] #数组0-1 [12,13,14,15 16,17,18,19 20,21,22,23] #数组0-2当axis=1时,剩余的0,2维度组成了垂直于轴1的平面,这个平面上的数组有[0,1, 2, 3 12,13,14,15] #数组1-1 [4,5,6,7 16,17,18,19] #数组1-2 [8,9,10,11 20,21,22,23] #数组1-3当axis=2时,剩余的0,1维度组成了垂直于轴2的平面,这个平面上的数组有[0, 4,8 12,16,20] #数组2-1 [1,5,9 13,17,21] #数组2-2 [2, 6,10 14,18,22] #数组2-3 [3,7,11 15,19,23] #数组2-4

3.根据以上三个维度,以下sum()函数实例就很好理解了。

A.轴编号为0时,数组0-1和数组0-2平面叠加

In [5]: np.sum(arr,axis=0) Out[5]: array([[12, 14, 16, 18], [20, 22, 24, 26], [28, 30, 32, 34]])

B.轴编号为1时,数组1-1和数组1-2和数组1-3平面叠加

In [6]: np.sum(arr,axis=1) Out[6]: array([[12, 15, 18, 21], [48, 51, 54, 57]])

C.轴编号为2时,数组2-1和数组2-2、2-3、2-4平面叠加

In [7]: np.sum(arr,axis=2) Out[7]: array([[ 6, 22, 38], [54, 70, 86]])

4.transpose()中三个轴编号的位置变化理解

transpose(a,b,c)其中a轴编号即为参考编号,垂直于a的平面即为所有平面,该平面上的数据再根据b,c相对于(0,1,2)的位置关系进行改变,下面以实例举例说明

A.transpose(0,1,2)对应的就是arr数组原形

In [8]: arr.transpose(0,1,2) Out[8]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])

B.transpose(0,2,1),即以0为参考编号,数组0-1和0-2即为所求平面数组,但是2,1相对于(0,1,2)后面的轴编号进行了交换,所以数组0-1/0-2要以对角线进行.T转置(与二维数组的转置一样),所以结果如下。其余同理。

In [9]: arr.transpose(0,2,1) Out[9]: array([[[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]], [[12, 16, 20], [13, 17, 21], [14, 18, 22], [15, 19, 23]]])

C.以transpose(2,1,0)来验证以上操作。2为参考编号,数组2-1/2-2/2-3/2-4即为所求平面,其中(2,1,0)中1,0位置相较于(0,1,2)进行了互换,所以转置,结果如下。

In [10]: arr.transpose(2,1,0) Out[10]: array([[[ 0, 12], [ 4, 16], [ 8, 20]], [[ 1, 13], [ 5, 17], [ 9, 21]], [[ 2, 14], [ 6, 18], [10, 22]], [[ 3, 15], [ 7, 19], [11, 23]]])

4.swapaxes(a,b)函数中两个轴编号理解

首先从词义上得知swap是“交换”的意思,swapaxes(a,b)函数则应该是a,b两个轴编号进行位置互换后数组的变化,这样原理和以上transpose相同了,下面实例验证

arr.swapaxes(0,1)=arr.swapaxes(1,0)=arr.transpose(1,0,2)

In [13]: arr.swapaxes(1,0) Out[13]: array([[[ 0, 1, 2, 3], [12, 13, 14, 15]], [[ 4, 5, 6, 7], [16, 17, 18, 19]], [[ 8, 9, 10, 11], [20, 21, 22, 23]]]) ------------------------------------------- In [14]: arr.swapaxes(0,1) Out[14]: array([[[ 0, 1, 2, 3], [12, 13, 14, 15]], [[ 4, 5, 6, 7], [16, 17, 18, 19]], [[ 8, 9, 10, 11], [20, 21, 22, 23]]]) ------------------------------------------------ In [15]: arr.transpose(1,0,2) Out[15]: array([[[ 0, 1, 2, 3], [12, 13, 14, 15]], [[ 4, 5, 6, 7], [16, 17, 18, 19]], [[ 8, 9, 10, 11], [20, 21, 22, 23]]])


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有